package br.com.sisat.persistencia.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.sisat.modelo.AgendaDTO;
import br.com.sisat.modelo.ConsultaDTO;
import br.com.sisat.modelo.EspecialidadeDTO;
import br.com.sisat.modelo.HorarioAtendimentoDTO;
import br.com.sisat.modelo.TerapeutaDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;

public class AgendaDAO {

	private static AgendaDAO dao;
	
	public static AgendaDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new AgendaDAO();
		}
		return dao;
	}
	
	public List<ConsultaDTO> consultar(AgendaDTO agenda) throws Exception {
		List<ConsultaDTO> consultas = new ArrayList<ConsultaDTO>();
		String sql = " SELECT consulta.id_consulta, consulta.id_terapeuta, especialidade.id_especialidade," +
				"consulta.id_pessoa, pessoa.nome, consulta.data, consulta.inicio, consulta.fim, consulta.nu_status," +
				" consulta.nu_combo " +
				"FROM sat.consulta consulta " +
				"join sat.pessoa pessoa on (consulta.id_pessoa = pessoa.id_pessoa) " +
				"join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
				"join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				"where 1=1 ";
		if(!ObjectUtil.isEmpty(agenda.getNuEspecialidade()) && agenda.getNuEspecialidade() != 0){
			sql =  sql + " and especialidade.id_especialidade = " + agenda.getNuEspecialidade().toString();
		}
		if(!ObjectUtil.isEmpty(agenda.getNuTerapeuta()) && agenda.getNuTerapeuta() != 0){
			sql =  sql + " and terapeuta.id_terapeuta = " + agenda.getNuTerapeuta().toString();
		}
		if(!ObjectUtil.isEmpty(agenda.getDtConsulta())){
			sql =  sql + " and consulta.data = '" + agenda.getDtConsulta() + "'";
		}
		
		sql = sql + " order by consulta.inicio";
		
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			ConsultaDTO consulta = new ConsultaDTO();
			consulta.setIdConsulta(rs.getLong("id_consulta"));
			consulta.setIdTerapeuta(rs.getLong("id_terapeuta"));
			consulta.setIdEspecialidade(rs.getLong("id_especialidade"));
			consulta.setIdPessoa(rs.getLong("id_pessoa"));
			consulta.setNoPaciente(rs.getString("nome"));
			consulta.setDtContulta(rs.getDate("data"));
			consulta.setInicio(rs.getString("inicio"));
			consulta.setFim(rs.getString("fim"));
			consulta.setNuStatus(rs.getLong("nu_status"));
			consulta.setCombo(rs.getLong("nu_combo"));
			consultas.add(consulta);
		}
		ps.close();
		return consultas;
	}

	public List<EspecialidadeDTO> recuperarEspecialidades() throws Exception {
		List<EspecialidadeDTO> especialidades = new ArrayList<EspecialidadeDTO>();
		String sql = " SELECT id_especialidade, nome FROM sat.especialidade order by id_especialidade;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			EspecialidadeDTO especialidade = new EspecialidadeDTO();
			especialidade.setIdEspecialidade(rs.getLong("id_especialidade"));
			especialidade.setNoEspecialidade(rs.getString("nome"));
			especialidades.add(especialidade);
		}
		conn.close();
		return especialidades;
	}

	public List<TerapeutaDTO> recuperarTerapeutas(Long idEspecialidade) throws Exception {
		List<TerapeutaDTO> terapeutas = new ArrayList<TerapeutaDTO>();
		                                    String sql = " SELECT terapeuta.id_terapeuta, pessoa.nome, terapeuta.id_pessoa " +
					 " FROM sat.terapeuta terapeuta " +
					 " join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa)" +
					 " where terapeuta.id_especialidade = ?" +
					 " order by terapeuta.id_pessoa; ";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setLong(1, idEspecialidade);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			TerapeutaDTO terapeuta = new TerapeutaDTO();
			terapeuta.setIdTerapeuta(rs.getLong("id_terapeuta"));
			terapeuta.setIdPessoa(rs.getLong("id_pessoa"));
			terapeuta.setNoTerapeuta(rs.getString("nome"));
			terapeutas.add(terapeuta);
		}
		conn.close();
		return terapeutas;
	}

	
	public List<TerapeutaDTO> recuperarTerapeutas() throws Exception {
		List<TerapeutaDTO> terapeutas = new ArrayList<TerapeutaDTO>();
		String sql = 	"SELECT terapeuta.id_terapeuta, pessoa.nome, terapeuta.id_pessoa , espec.nome as nome_especialidade "+
				 		"FROM sat.terapeuta terapeuta  "+
				 		"JOIN sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) "+
                        "JOIN sat.especialidade espec on (terapeuta.id_especialidade = espec.id_especialidade) "+
                        "order by pessoa.nome;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			TerapeutaDTO terapeuta = new TerapeutaDTO();
			terapeuta.setIdTerapeuta(rs.getLong("id_terapeuta"));
			terapeuta.setIdPessoa(rs.getLong("id_pessoa"));
			terapeuta.setNoTerapeuta(rs.getString("nome"));
			terapeuta.setNoEspecialidade(rs.getString("nome_especialidade"));
			terapeutas.add(terapeuta);
		}
		conn.close();
		return terapeutas;
	}

	public void excluirConsulta(HorarioAtendimentoDTO horarioDTO) throws Exception {
		String sql = "DELETE FROM sat.consulta WHERE id_consulta = " + horarioDTO.getIdConsulta().toString();
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.executeUpdate();
		conn.commit();
		ps.close();
	}

	public void mostraCombo(HorarioAtendimentoDTO horario) throws Exception {
		String sql = "UPDATE sat.consulta SET nu_combo = " + horario.getCombo() + " WHERE id_consulta = " + horario.getIdConsulta();
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.executeUpdate();
		conn.commit();
		ps.close();
	}
}
